package main

import (
	"GK-app/clear"
	"GK-app/logger"
	"GK-app/process_manager"
	"GK-app/request"
	"bytes"
	"fmt"
	"os"
	"sync"
)

func main() {
	// 初始化日志文件
	logFile, err := logger.InitLogFile()
	if err != nil {
		fmt.Println("无法创建日志文件:", err)
		return
	}
	defer func(logFile *os.File) {
		err := logFile.Close()
		if err != nil {
			fmt.Println("无法关闭日志文件:", err)
		}
	}(logFile) // 匿名函数：defer logFile.Close()

	// 获取日志文件路径，以便在其他模块中使用
	logFilePath := logFile.Name()

	// 目标 URL
	getURL := "https://httpbin.org/get"
	postURL := "https://httpbin.org/post"

	// 创建一个 10kb 的数据用于上传
	dataToUpload := bytes.Repeat([]byte("A"), 10*1024)

	// 使用 sync.WaitGroup 来同步 Goroutines
	var wg sync.WaitGroup

	// 控制清屏的计数器
	count := 0
	clearAfter := 500 // 每 500 次清屏一次

	// 获取程序的运行路径
	directoryPath := process_manager.GetDirectoryPath()
	processPath, err := process_manager.GetProcessPath(directoryPath)
	if err != nil {
		logger.LogError("获取进程路径出错", err)
		return
	}

	for {
		fmt.Printf("程序开始第%d次循环:\n", count)
		wg.Add(2) // 2 个 Goroutine：下载和上传

		// 执行 GET 和 POST 请求，并使用带限流的日志记录
		request.PerformRequestsWithLogger(getURL, postURL, dataToUpload, &wg)

		// 等待所有 Goroutines 完成
		wg.Wait()

		// 检查日志是否有新的错误，决定是否杀死和重启进程
		err := process_manager.MonitorAndRestartProcessIfNeeded(logFilePath, directoryPath, processPath)
		if err != nil {
			fmt.Println(err)
		}

		// 增加计数器
		count++

		// 清屏逻辑
		if count >= clearAfter {
			clear.ClearScreen()
			count = 0 // 重置计数器
			fmt.Println("-------------------------")
			fmt.Printf("程序重新开始循环:\n")
		}
	}
}
